package main

import "fmt"

func main() {

	// defer 延迟调用, main 函数结束前调用
	defer fmt.Println("bbbbbbb")

	defer fmt.Println("aaaaaaa")

	defer fmt.Println("ccccccc")

	test(1)


	// defer 与匿名函数结合使用
	a := 10
	b := 20

	defer func() {
		fmt.Printf("内部: a = %d, b = %d\n", a, b)
	}()

	defer func(a, b int) {
		fmt.Printf("内部: a = %d, b = %d\n", a, b)
	}(a, b)

	a = 111
	b = 222
	fmt.Printf("外部: a = %d, b = %d\n", a, b)

	/*
	输出结果:
	外部: a = 111, b = 222
	内部: a = 111, b = 222
	说明: 含defer语句的无参匿名函数延迟执行, 外部变量和常量改变后, 再执行的含defer语句的无参匿名函数值是改变后的值
	     含defer语句的有参匿名函数延迟执行, 外部变量和常量改变后, 再执行的含defer语句的有参匿名函数值是
	     原来外部变量和常量初始化的值，原理是: 当程序执行到含defer语句的有参匿名函数时, 外部变量和常量
		 初始化的值已经进行了值传递, 只是因为有了defer关键字, 所以函数未调用而已
	 */
}

func test(i int) {
	result := 100 / i
	fmt.Println(result)
}

/*
输出结果:
100
ccccccc
aaaaaaa
bbbbbbb
说明: 多个 defer 时, 先进后出, 先写的 defer 语句, 最后执行
 */




